/**
 * 您可以将常用的方法、或系统 API，统一封装，暴露全局，以便各页面、组件调用，而无需 require / import.
 */
// const $apis = require('./apis').default

import routerPath from '../json/routerPath.json'

var currentView = null
let clickIntervalTime = 0
let prevActionCode = ''
let canRequestCactionPop = true
var homeViewConfig = {
  //兜底页面配置项
  name: 'Main',
  incloudCodeArr: ['MOMO_WELFARE', 'MOMO_ADD_EVENTS', 'MOMO_ADD_CHARGE', 'MOMO_HOME'],
  tabCheckName: 'selectIndex',
  tabDefaultIndex: 0,
  defaultRoutePath: '/pagesA/Main',
}
let actionPopType = ''

/**
 * 自定义百度广告弹窗和视频弹窗事件处理器
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 */
function bqtVideoAdEventDispatch(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'bqtVideoAdEventDispatch=====>', obj)
  let _curPopType = obj.popStyleName.toLowerCase()
  LOG('BQT_AD', 'bqtVideoAdEventDispatch=====>', _curPopType)
  switch (_curPopType) {
    case 'baidu':
      baiduPopEventHandler(obj, pageDetail, appObj)
      break
    case 'encourage':
      encouragePopEventHandler(obj, pageDetail, appObj)
      break
  }
}
/**
 * 自定义百度通用弹窗事件处理器
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopEventHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopEventHandler=====>', obj)
  let _actionName = obj.action
  switch (_actionName) {
    case 'adClick': //广告点击
      baiduPopAdClickHandler(obj, pageDetail, appObj)
      break
    case 'backPress': //物理返回
      baiduPopBackPressHandler(obj, pageDetail, appObj)
      break
    case 'backIconClick': //弹窗上物理返回按钮点击
      baiduPopBackIconClickHandler(obj, pageDetail, appObj)
      break
    case 'closeClick': //关闭按钮点击
    case 'adCloseClick': //百度广告关闭按钮点击
      baiduPopCloseClickHandler(obj, pageDetail, appObj)
      break
    case 'negClick': //负向按钮点击
      baiduPopNegClickHandler(obj, pageDetail, appObj)
      break
    case 'adLoadFailed': //百度广告获取失败
    case 'adRequestFailed': //百度广告获取失败 sdk未返回数据
    case 'popCodeError': //百度弹窗code获取失败
      baiduPopAdLoadFailedHandler(obj, pageDetail, appObj)
      break
  }
}
/**
 * 自定义百度通用弹窗事件处理器 - 广告点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopAdClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopAdClickHandler=====>广告点击', obj)
  //点击广告按钮
  AD_SDK_UTILS.clickManuAdvForBtn(obj.popData.advConfig)
  AD_UTILS.adClickHandler(POP_TOOLS, 'readFunctionPopAdClick', [
    obj,
    pageDetail,
    appObj,
  ])
}
/**
 * 自定义百度通用弹窗事件处理器 - 物理返回
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopBackPressHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopBackPressHandler=====>物理返回', obj)
  let param = {
    ad_position: obj.popData.popConfig.popName,
    page_type: obj.popData.popConfig.popGroupName,
  }

  switch (obj.actionCode) {
    case 'PAGE_ENTRY':
    case 'POPUP_CLOSE':
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      COMMON_REPORT_UTILS.back_click_report(
        param.ad_position,
        param.page_type,
        '关闭弹窗'
      )
      break
    case 'PAGE_BACK':
    case 'SAVE_EVENTS':
    case 'SAVE_CHARGE':
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj, true, param)
      break
  }
}
/**
 * 自定义百度通用弹窗事件处理器 - 返回按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopBackIconClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopBackIconClickHandler=====>返回按钮点击', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}
/**
 * 自定义百度通用弹窗事件处理器 - 关闭按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopCloseClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopCloseClickHandler=====>关闭按钮点击', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}
/**
 * 自定义百度通用弹窗事件处理器 - 负向按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopNegClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopNegClickHandler=====>负向按钮点击', obj)
  readFunctionPopClose(obj, pageDetail, appObj, true)
}
/**
 * 自定义百度通用弹窗事件处理器 - 广告获取失败
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function baiduPopAdLoadFailedHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'baiduPopAdLoadFailedHandler=====>广告获取失败', obj)
  noAd4UseEventHandler(obj, pageDetail, appObj)
}
/**
 * 自定义视频通用弹窗事件处理器
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopEventHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopEventHandler=====>', obj)
  let _actionName = obj.action
  switch (_actionName) {
    case 'videoAdClick': //广告点击
      encouragePopAdClickHandler(obj, pageDetail, appObj)
      break
    case 'backPress': //物理返回
      encouragePopBackPressHandler(obj, pageDetail, appObj)
      break
    case 'backIconClick': //弹窗上物理返回按钮点击
      encouragePopBackIconClickHandler(obj, pageDetail, appObj)
      break
    case 'closeClick': //关闭按钮点击
      encouragePopCloseClickHandler(obj, pageDetail, appObj)
      break
    case 'negClick': //负向按钮点击
      encouragePopNegClickHandler(obj, pageDetail, appObj)
      break
    case 'popCodeError': //视频弹窗配置获取失败
      encourageAdLoadFailedHandler(obj, pageDetail, appObj)
      break
  }
}
/**
 * 自定义视频通用弹窗事件处理器 - 弹窗配置获取失败
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encourageAdLoadFailedHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encourageAdLoadFailedHandler=====>广告获取失败', obj)
  noAd4UseEventHandler(obj, pageDetail, appObj)
}

/**
 * 自定义视频通用弹窗事件处理器 - 广告点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopAdClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopAdClickHandler=====>广告点击', obj)
  // 根据配置选择是否触发激励视频
  if (obj?.popData?.popConfig?.commonStyle?.useType == 1) {
    LOG('VIEW', '当前弹窗的用途为激励视频')
    AD_SDK.getVedioAdv({
      success: (res) => {
        LOG('VIEW', '>>>>>>>>>>>>>>>>视频广告播放完成', res)
        currentView.videoBqtConfig.isShow = false
        readFunctionPopAdClick(obj, pageDetail, appObj)
      },
      incomplete: (err) => {
        LOG('VIEW', '>>>>>>>>>>>>>>>>视频广告播放未完成', err)
        LOG(
          'VIEW',
          'obj.popData.popConfig.commonStyle.notViewBackClosePopup',
          obj.popData.popConfig.commonStyle.notViewBackClosePopup
        )
        if (obj.popData.popConfig.commonStyle.notViewBackClosePopup == 1) {
          currentView.videoBqtConfig.isShow = false
          readFunctionPopClose(obj, pageDetail, appObj)
        } else {
          $utils.showToast('视频广告需要看完呦！')
        }
      },
      fail: (err) => {
        LOG('VIEW', '>>>>>>>>>>>>>>>>视频广告播放失败', err)
        $utils.showToast('当前暂无广告,请稍后重试')
        currentView.videoBqtConfig.isShow = false
        readFunctionPopClose(obj, pageDetail, appObj)
      },
      error: (err) => {
        LOG('VIEW', '>>>>>>>>>>>>>>>>视频广告拉取失败', err)
        $utils.showToast('当前暂无广告,请稍后重试')
        currentView.videoBqtConfig.isShow = false
        readFunctionPopClose(obj, pageDetail, appObj)
      },
    })
  } else {
    LOG('VIEW', '当前弹窗的用途为非激励视频')
    currentView.videoBqtConfig.isShow = false
    readFunctionPopClose(obj, pageDetail, appObj)
    if (obj.compData && obj.compData.addDesktopStatus) {
      addDesktopHandler(obj, pageDetail)
    }
  }
}
//加桌弹窗 加桌组件事件处理
function addDesktopHandler(obj, pageDetail) {
  switch (obj.compData.addDesktopStatus) {
    case 1:
      //默认加桌
      require('@system.shortcut').install({
        success: function () {
          $utils.showToast('加桌成功')
          COMMON_REPORT_UTILS.add_icon_report(
            '成功',
            '加桌弹窗',
            pageDetail.pageName
          )
        },
        fail: function (data, code) {
          COMMON_REPORT_UTILS.add_icon_report(
            '失败',
            '加桌弹窗',
            pageDetail.pageName
          )
        },
      })
      break
    case 2:
      //一键加桌成功
      $utils.showToast('加桌成功')
      COMMON_REPORT_UTILS.add_icon_report(
        '成功',
        '加桌弹窗',
        pageDetail.pageName
      )
      break
    case 3:
      //一键加桌失败
      COMMON_REPORT_UTILS.add_icon_report(
        '失败',
        '加桌弹窗',
        pageDetail.pageName
      )
      break
  }
}
/**
 * 自定义视频通用弹窗事件处理器 - 物理返回
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopBackPressHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopBackPressHandler=====>物理返回', obj)
  let param = {
    ad_position: obj.popData.popConfig.popName,
    page_type: obj.popData.popConfig.popGroupName,
  }

  switch (obj.actionCode) {
    case 'PAGE_ENTRY':
    case 'POPUP_CLOSE':
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      COMMON_REPORT_UTILS.back_click_report(
        param.ad_position,
        param.page_type,
        '关闭弹窗'
      )
      break
    case 'PAGE_BACK':
    case 'SAVE_EVENTS':
    case 'SAVE_CHARGE':
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj, true, param)
      break
  }
}
/**
 * 自定义视频通用弹窗事件处理器 - 返回按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopBackIconClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopBackIconClickHandler=====>返回按钮点击', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}
/**
 * 自定义视频通用弹窗事件处理器 - 关闭按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopCloseClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopCloseClickHandler=====>关闭按钮点击', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}
/**
 * 自定义视频通用弹窗事件处理器 - 负向按钮点击
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function encouragePopNegClickHandler(obj, pageDetail, appObj) {
  LOG('BQT_AD', 'encouragePopNegClickHandler=====>负向按钮点击', obj)
  // btn_jump_key  跳转新页面1 按策略路由返回2 退出应用3 关闭弹窗4'
  readFunctionPopClose(obj, pageDetail, appObj, true)
}
/**
 * 自定义通用弹窗事件处理器
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 */
function commonPopControllerEventDispatch(obj, pageDetail, appObj) {
  LOG('commonPopControllerEventDispatch=====>', obj)
  let _curPopType = obj.popData.popConfig.popType.toLowerCase()
  LOG('commonPopControllerEventDispatch=====>', _curPopType)
  switch (_curPopType) {
    case 'custom':
    case 'customback':
    case 'adcustom':
    case 'common':
      customPopEventHandler(obj, pageDetail, appObj)
      break
    case 'boost':
      boostCompEventHandler(obj, pageDetail, appObj)
      break
  }
}
/**
 * 补量组件非展开情况下点击事件
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 */
function boostCompEventHandler(obj, pageDetail, appObj) {
  LOG('boostCompEventHandler=====>', obj)
  switch (obj.action) {
    case 'popCodeError':
      if (obj.actionCode == 'PAGE_BACK') {
        //按策略路由返回
        getPageBackRoute(pageDetail.pageCode, appObj, true, {
          ad_position: '',
          page_type: '',
        })
      }
      break
  }
}
function noAd4UseEventHandler(obj, pageDetail, appObj) {
  LOG('customPopBackPressHandler===>无可用广告', obj, pageDetail)
  switch (obj.actionCode) {
    case 'PAGE_ENTRY':
      if (canRequestCactionPop) {
        canShowActionPop(obj, pageDetail).catch((err) => {
          // if(obj.code){
          //   commonFunc2PatchPopShow(pageDetail,'POPUP_CLOSE',obj.code,pageDetail.pageRoute,appObj)
          // }
        })
      }

      break
    case 'POPUP_CLOSE':
      // mxt 存在处理逻辑问题  延后处理
      if (canRequestCactionPop) {
        canShowActionPop(obj, pageDetail).catch((err) => {
          // if(obj.code){
          //   commonFunc2PatchPopShow(pageDetail,'POPUP_CLOSE',obj.code,pageDetail.pageRoute,appObj)
          // }
        })
      }
      break
    case 'PAGE_BACK':
    case 'SAVE_EVENTS':
    case 'SAVE_CHARGE':
      //按策略路由返回
      if (canRequestCactionPop) {
        canShowActionPop(obj, pageDetail).catch((err) => {
          getPageBackRoute(pageDetail.pageCode, appObj, true, {
            ad_position: '',
            page_type: '',
          })
        })
      } else {
        getPageBackRoute(pageDetail.pageCode, appObj, true, {
          ad_position: '',
          page_type: '',
        })
      }
      break
    default:
      if (canRequestCactionPop) {
        canShowActionPop(obj, pageDetail).catch((err) => {
          // $utils.showToast('当前暂无广告，请稍后重试')
        })
      } else {
        // $utils.showToast('当前暂无广告，请稍后重试')
      }
      break
  }
  // canRequestCactionPop = true
}
/**
 *    mxt  页面进入状态下 无填充广告触发
 *    需要获取当前的 状态需要触发的弹窗
 *    需要在这里判断 触发百度 还是激励视频
 *    优先判断百度 没有百度走激励视频
 *
 * @param {*} obj
 * @param {*} pageDetail
 * @returns
 */

function canShowActionPop(obj, pageDetail, requestType = 'request_fail') {
  LOG('canShowActionPop mxt ', obj)

  return new Promise((resolve, reject) => {
    if (requestType == 'request_fail') {
      canRequestCactionPop = false
    }
    TACTICS_SDK_UTILS.getActionPopupCode(
      obj.actionCode,
      requestType,
      pageDetail.pageCode,
      pageDetail.pageOrigin
    )
      .then((res) => {
        LOG('popUtils mxt ', res)

        actionPopType = requestType

        if (res.code) {
          if (res.code.split('_')[0] == 'Baidu') {
            currentView.addBqtVideoPop(
              res.code,
              obj.actionCode,
              obj.customAction
            )
          } else {
            currentView.nativeBoostGroupController.actionCode = obj.actionCode
            currentView.nativeBoostGroupController.customAction =
              obj.customAction
            currentView.nativeBoostGroupController.popCode = res.code
            currentView.nativeBoostGroupController.backPressTimes++
          }
          currentView.isAllowBackPress = true
          resolve()
        } else {
          currentView.isAllowBackPress = true
          let _report_param = {
            id: '无',
            ad_network: 1,
            ad_type: '',
            scenario: action2Name(obj.actionCode),
            page_type: '',
            ad_position: '',
            ad_style: '',
            requestNum: '1',
            result: '失败',
          }
          console.log('2222222222', _report_param)
          AD_SDK.uploadAdInfo('take', _report_param)
          reject()
        }
      })
      .catch((err) => {
        LOG('==err', err, obj.actionCode)
        currentView.isAllowBackPress = true
        let _report_param = {
          id: '无',
          ad_network: 1,
          ad_type: '',
          scenario: action2Name(obj.actionCode),
          page_type: '',
          ad_position: '',
          ad_style: '',
          requestNum: '1',
          result: '失败',
        }
        console.log('2222222222', _report_param)
        AD_SDK.uploadAdInfo('take', _report_param)
        if (obj.actionCode == 'READ_AD_TEXT_CUSTOM') {
          //页内自定义原生拿取失败 并且未配置视频或者百度 则打开tab滚动
          try {
            currentView.textAdLoadFaildHandler()
          } catch (error) { }
        }
        reject(err)
      })
  })
}

/**
 * 自定义通用弹窗事件处理器
 * @param {Object} obj 弹窗事件派发出来的数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopEventHandler(obj, pageDetail, appObj) {
  let _actionName = obj.action
  switch (_actionName) {
    case 'adClickBtn': //按钮点击
    case 'adClickImg': //素材点击
      customPopAdClickHandler(
        obj,
        pageDetail,
        appObj,
        _actionName == 'adClickBtn' ? 1 : 2
      )
      break
    case 'noClickBtn': //不触发广告点击
      customPopAdClickHandler(obj, pageDetail, appObj, 3)
      break
    case 'materialClickBtn': //素材广告点击
      customPopAdClickHandler(obj, pageDetail, appObj, 3)
      break
    case 'noClickImg': //不触发广告点击
      customPopAdClickHandler(obj, pageDetail, appObj, 3)
      break
    case 'backPress': //物理返回
      customPopBackPressHandler(obj, pageDetail, appObj)
      break
    case 'backIconClick': //弹窗上物理返回按钮点击
      customPopBackIconClickHandler(obj, pageDetail, appObj)
      break
    case 'closeClick': //关闭按钮点击
      customPopCloseClickHandler(obj, pageDetail, appObj)
      break
    case 'negClick': //负向按钮点击
      customPopNegClickHandler(obj, pageDetail, appObj)
      break
  }
}
/**
 * 自定义通用弹窗广告点击事件处理器
 * @param {Object} obj 弹窗事件派发数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @param {Number} clickType 点击类型 1 按钮 2 素材
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopAdClickHandler(obj, pageDetail, appObj, clickType) {
  LOG(
    'customPopAdClickHandler===================>广告点击,广告类型：',
    clickType,
    pageDetail
  )
  switch (clickType) {
    case 1:
      //点击广告按钮
      AD_SDK_UTILS.clickManuAdvForBtn(obj.popData.advConfig)
      break
    case 2:
      //点击广告图片
      AD_SDK_UTILS.clickManuAdvForImg(obj.popData.advConfig)
      break
    case 3:
      readFunctionPopAdClick(obj, pageDetail, appObj)
      break
    default:
      console.info('dialog 广告点击参数错误')
      break
  }
  // mxt  统计点击间隔时间
  if (clickType == 3) return

  LOG('customPopAdClickHandler===>', obj)
  AD_UTILS.adClickHandler(POP_TOOLS, 'readFunctionPopAdClick', [
    obj,
    pageDetail,
    appObj,
  ])
}
/**
 * 自定义通用弹窗广告物理返回事件处理器
 * @param {Object} obj 弹窗事件派发数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopBackPressHandler(obj, pageDetail, appObj) {
  LOG('customPopBackPressHandler===>物理返回', obj)
  let param = {
    ad_position: obj.popData.popConfig.popName,
    page_type: obj.popData.popConfig.popGroupName,
  }

  switch (obj.actionCode) {
    case 'PAGE_ENTRY':
    case 'POPUP_CLOSE':
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      COMMON_REPORT_UTILS.back_click_report(
        param.ad_position,
        param.page_type,
        '关闭弹窗'
      )
      break
    case 'PAGE_BACK':
    case 'SAVE_EVENTS':
    case 'SAVE_CHARGE':
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj, true, param)
      break
  }
}
/**
 * 自定义通用弹窗广告返回按钮点击事件处理器
 * @param {Object} obj 弹窗事件派发数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopBackIconClickHandler(obj, pageDetail, appObj) {
  LOG('customPopBackIconClickHandler===>返回按钮', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}
/**
 * 自定义通用弹窗广告关闭按钮点击事件处理器
 * @param {Object} obj 弹窗事件派发数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopCloseClickHandler(obj, pageDetail, appObj) {
  LOG('customPopCloseClickHandler===>关闭按钮', obj)
  commonFunc2PatchPopShow(
    pageDetail,
    'POPUP_CLOSE',
    obj.popData.popConfig.code,
    pageDetail.pageRoute,
    appObj
  )
}

/**
 * 自定义通用弹窗广告负向按钮点击事件处理器
 * @param {Object} obj 弹窗事件派发数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @description 自定义弹窗和自定义后退弹窗处理
 */
function customPopNegClickHandler(obj, pageDetail, appObj) {
  LOG('customPopNegClickHandler===>负向按钮', obj)
  // btn_jump_key  跳转新页面1 按策略路由返回2 退出应用3 关闭弹窗4'
  readFunctionPopClose(obj, pageDetail, appObj, true)
}
/**
 *
 * @param {String} pageRoute 页面路由
 * @param {String} pageCode 页面code
 * @param {Boolean} isbackpress 是否为物理返回执行到这里的
 * @param {Object} param 物理返回携带的弹窗参数
 */
function stacksPath(pageRoute, pageCode, isbackpress = false, param = null) {
  LOG('-----------------stacksPath', pageRoute)
  if (pageRoute) {
    let params = {
      pageOrigin: pageCode,
      pathUrl: currentView.pathUrl,
    }
    params.pathUrl = currentView.pathUrl
    var aimRoute = ''
    // 字符串split方法 分割的字符必须在字符串中存在并且不能是最后一位
    if (pageRoute.indexOf('?') !== -1) {
      //tab页物理返回回到指定的tab情况下使用
      let curRouteCompute = pageRoute.split('?')
      aimRoute = curRouteCompute[0]
      if (curRouteCompute.length > 1) {
        if (curRouteCompute[1].indexOf('&') !== -1) {
          let paramArr = curRouteCompute[1].split('&')
          for (let i = 0; i < paramArr.length; i++) {
            let curParamItem = paramArr[i].split('=')
            params[curParamItem[0]] = curParamItem[1]
          }
        } else {
          let curParamItem = curRouteCompute[1].split('=')
          params[curParamItem[0]] = curParamItem[1]
        }
      }
    } else {
      aimRoute = pageRoute
    }
    let isCur = $utils.routeCheckUrl(aimRoute)
    LOG('-----------------stacksPath isCur', isCur)

    if (isCur) {
      // tab页切换
      GLOBAL_UTILS.routerJumpSelfHandeler(params)
    } else {
      // 跳转页面
      $utils.routetheUrl(aimRoute, params, true)
    }
    if (isbackpress) {
      COMMON_REPORT_UTILS.back_click_report(
        param.ad_position,
        param.page_type,
        '跳转页面'
      )
    }
  } else {
    if (
      currentView.pageDetail.pageRoute &&
      currentView.pageDetail.pageRoute.indexOf(homeViewConfig.name) !== -1
    ) {
      LOG('-----------------stacksPath', 1)
      if (isbackpress) {
        COMMON_REPORT_UTILS.back_click_report(
          param.ad_position,
          param.page_type,
          '退出应用'
        )
      }
      currentView.$app.exit()
    } else {
      if (isbackpress) {
        COMMON_REPORT_UTILS.back_click_report(
          param.ad_position,
          param.page_type,
          '跳转页面'
        )
      }
      // setTimeout(() => {
      if ($utils.routeCheckPages()) {
        LOG('-----------------stacksPath', 2)
        $utils.goBack()
      } else {
        let _param = new Object()
        _param[`${homeViewConfig.tabCheckName}`] =
          homeViewConfig.tabDefaultIndex
        _param['pathUrl'] = currentView.pageDetail.pageName
        $utils.routeReplacetheUrl(homeViewConfig.defaultRoutePath, _param)
        LOG('-----------------stacksPath', 3)
      }
      // }, 200)
    }
  }
}

/**
 * 通用-->获取指定行为的指定页面下一个弹窗code
 * @param {Object} pageDetail 页面信息
 * @param {String} actionCode 行为code PAGE_BACK PAGE_ENTRY POPUP_CLOSE
 * @param {String} popupCode 弹窗code 如果是弹窗关闭获取下一个弹窗code时需传入此致 可不传
 * @param {String} pageRoute 页面路由  example pageView/readInfo
 * @param {Object} appObj 当前页面对象
 * @param {Number} isclickButton 是否为点击按钮进入的 1 是 2 否  默认是否
 */
async function commonFunc2PatchPopShow(
  pageDetail,
  actionCode,
  popupCode = '',
  pageRoute,
  appObj,
  customAction = {}
) {
  LOG(
    `commonFunc2PatchPopShow===>来源${pageDetail.pageOrigin}_目标${pageDetail.pageCode}_动作${actionCode}_弹窗code${popupCode}_页面路由${pageRoute}`
  )

  canRequestCactionPop = true

  // 判断 当前弹窗是否为替换弹窗 如果是就还原之前的code  prevActionCode 缓存的上一个行为 用来检验当前弹窗是否为替换弹窗
  let originalPopCode = popupCode
  if (prevActionCode) {
    originalPopCode = await TACTICS_SDK_UTILS.getOriginalPopCode(
      pageDetail.pageCode,
      pageDetail.pageOrigin,
      prevActionCode,
      popupCode
    )
  }
  if (actionCode == 'PAGE_BACK') {
    prevActionCode = ''
  } else {
    prevActionCode = actionCode
  }
  currentView.isAllowBackPress = false
  TACTICS_SDK_UTILS.getPopupCodeByTacticsSdk(appObj, {
    pageCode: pageDetail.pageCode,
    pageOrigin: pageDetail.pageOrigin,
    actionCode,
    popupCode: originalPopCode,
  })
    .then((code) => {
      //  点击间隔处理
      //1 获取 应用配置点击间隔时间
      //2 获取当前间隔时间
      // 无弹窗code 表示现在是补量池请求  无需间隔处理

      let nativeAdClickInterval = TACTICS_SDK.getApplyConfig('native_ad_click_interval', 'N')
      let nowClickIntervalTime = Date.now()
      LOG(
        `mxt  判断点击间隔 ：应用配置的间隔：${nativeAdClickInterval} 当前展示时间：${nowClickIntervalTime} 差值:${nowClickIntervalTime - clickIntervalTime
        }:比较`,
        nowClickIntervalTime - clickIntervalTime < nativeAdClickInterval
      )
      if (nowClickIntervalTime - clickIntervalTime < nativeAdClickInterval) {
        // clickIntervalTime = 0
        LOG(' mxt 展示间隔内弹窗')
        canShowActionPop(
          { actionCode: actionCode, code: originalPopCode, customAction },
          pageDetail,
          'click_interval'
        )
          .then(() => {
            return
          })
          .catch((err) => {
            LOG(' mxt 当前没有配置的弹窗code ', err)
            if (actionCode == 'PAGE_BACK') {
              COMMON_REPORT_UTILS.back_click_report('', '', '跳转页面')
              getPageBackRoute(pageDetail.pageCode, appObj)
            }
            return
          })
      } else {
        LOG(`commonFunc2PatchPopShow code1===>${code}`)
        if (code.split('_')[0] == 'Baidu') {
          //自定义弹窗 百度
          currentView.addBqtVideoPop(code, actionCode, customAction)
        } else {
          //自定义弹窗 原生
          currentView.nativeBoostGroupController.actionCode = actionCode
          currentView.nativeBoostGroupController.popCode = code
          currentView.nativeBoostGroupController.customAction = customAction
          currentView.nativeBoostGroupController.backPressTimes++
        }
        currentView.isAllowBackPress = true
        if (actionCode == 'PAGE_BACK') {
          COMMON_REPORT_UTILS.back_click_report('', '', '触发弹窗')
        }
        // AD_SDK_UTILS.adConfigData.uploadFristPopClick++
      }
    })
    .catch((err) => {
      LOG(
        `commonFunc2PatchPopShow catch===>`,
        actionCode,
        pageDetail,
        currentView.pageDetail,
        currentView.isAllowBackPress
      )
      // mxt 这里可能需要提示
      // currentView.nativeBoostGroupController.actionCode = ''
      // 需要获取章首广告的情况有两种 第一种情况 页面进入后获取code为空时  第二种情况 弹窗code
      // 广告拿取失败上报

      switch (actionCode) {
        case 'PAGE_BACK':
        case 'SAVE_EVENTS':
        case 'SAVE_CHARGE':
          COMMON_REPORT_UTILS.back_click_report('', '', '跳转页面')
          getPageBackRoute(pageDetail.pageCode, appObj)
          break
        case 'PAGE_ENTRY':
          currentView.isAllowBackPress = true
          break
        case 'POPUP_CLOSE':
          currentView.isAllowBackPress = true
          break
        default:
          currentView.isAllowBackPress = true
          break
      }
    })
}
/**
 * 获取页面路由
 * @param {String} pageCode 页面code
 * @param {String} appObj app.ux对象
 * @param {Boolean} isbackpress 是否为物理返回的
 * @param {Object} param 物理返回携带的弹窗参数
 */
function getPageBackRoute(pageCode, appObj, isbackpress = false, param = null) {
  LOG(`getPageBackRoute==> bg`)
  LOG(pageCode)
  LOG(`getPageBackRoute==> end`)
  TACTICS_SDK_UTILS.getPageBackRouterByTacticsSdk(appObj, pageCode)
    .then((pageUrl) => {
      LOG('getPageBackRouterByTacticsSdk pageUrl===>', pageUrl)
      stacksPath(pageUrl, pageCode, isbackpress, param)
    })
    .catch((error) => {
      LOG('getPageBackRouterByTacticsSdk failed===>', error)
      stacksPath('', pageCode, isbackpress, param)
    })
}

/**
 * 通用获取书券接口
 * @param {String} brand 厂商
 * @param {String} popType 奖励来源
 * @param {Number} otherCount 额外奖励
 * @description 如果传了额外奖励,标识获取的是额外奖励,如未传,则标识获取的第一次奖励
 */
async function commonReceiveCoinFunc(brand, popType, otherCount) {
  let param = {}
  param.task_code = popType
  param.brand = brand
  param.coupon = otherCount
  let _apiRes = await $apis.example.welfareReceiveNewApi(param).then((res) => {
    console.log('---commonReceiveCoinFunc--- bg')
    console.log(res)
    console.log('---commonReceiveCoinFunc--- end')
    return res
  })
  return _apiRes
}
/**
 * 切换当前页面数据
 * @param {Object} view 当前页面
 */
function changeCurrentView(view) {
  currentView = view
}
/**
 * 暴露当前的弹窗状态给埋点
 * @returns
 */
function reportActionPopType() {
  if (actionPopType == 'request_fail') {
    return '-请求失败'
  } else if (actionPopType == 'click_interval') {
    return '-点击间隔'
  } else {
    return ''
  }
}
/**
 * 重置当前的弹窗状态给埋点
 * @returns
 */
function resetActionPopType() {
  actionPopType = ''
}

async function readFunctionPopAdClick(
  obj,
  pageDetail,
  appObj,
  isReportOverTime = false
) {
  LOG(
    'readFunctionPopAdClick===================>',
    obj.actionCode,
    obj.customAction
  )
  if (isReportOverTime) {
    try {
      COMMON_REPORT_UTILS.ad_overtime_report(obj.popData.advConfig.scenario)
    } catch (error) {
      LOG(error)
    }
  }
  if (
    ['SIGN_IN', 'AWARD_CLICK', 'BOX_CLICK'].find(
      (item) => item == obj.actionCode
    )
  ) {
    LOG('readFunctionPopAdClick===================>1')
    if (obj.customAction && obj.customAction.task_code) {
      LOG('readFunctionPopAdClick===================>2')
      let coin = Number(obj.popData.popConfig.configBaseFormData.custom_content)
      let _apiRes = await commonReceiveCoinFunc(
        appObj.brand,
        obj.customAction.task_code,
        coin
      )
      LOG('readFunctionPopAdClick===================>3', _apiRes)
      if (_apiRes.code == 200) {
        $utils.showToast(`恭喜您获得${coin}书券`)
        try {
          currentView.getWelfarePageData()
        } catch (error) { }
      } else {
        _apiRes.msg && $utils.showToast(_apiRes.msg)
      }
    }
  }
  if (obj.actionCode == 'READ_PAGE_CLICK') {
    $utils.showToast('章节已解锁')
  }
  let btnJumpKey = Number(obj.popData.popConfig.btnStyle.jumpKey)
  if (obj.action == 'materialClickBtn') {
    btnJumpKey = Number(obj.popData.popConfig.btnStyle.btn_material_jump_key)
  }
  switch (btnJumpKey) {
    case 1:
      let pageCode = obj.popData.popConfig.btnStyle.jumpValue
      $utils.routetheUrl(
        routerPath[pageCode].path,
        { ...routerPath[pageCode].param, pathUrl: pageDetail.pageName },
        false
      )
      break
    case 2:
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj)
      break
    case 3:
      try {
        //退出应用
        currentView.$app.exit()
      } catch (error) { }
      break
    case 4:
      // 关闭弹窗
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      break
    case 5:
      // 跳转H5
      break
  }
}

function readFunctionPopClose(obj, pageDetail, appObj, isNeg = false) {
  // btn_jump_key  跳转新页面1 按策略路由返回2 退出应用3 关闭弹窗4'
  let btnJumpKey = isNeg
    ? Number(obj.popData.popConfig.negStyle.jumpKey)
    : Number(obj.popData.popConfig.btnStyle.jumpKey)
  LOG('readFunctionPopClose===================>', btnJumpKey)
  switch (btnJumpKey) {
    case 1:
      let pageCode = obj.popData.popConfig.btnStyle.jumpValue
      $utils.routetheUrl(
        routerPath[pageCode].path,
        { ...routerPath[pageCode].param, pathUrl: pageDetail.pageName },
        false
      )
      break
    case 2:
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj)
      break
    case 3:
      try {
        //退出应用
        currentView.$app.exit()
      } catch (error) { }
      break
    case 4:
      // 关闭弹窗
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      break
    case 5:
      $utils.routetheUrl('/pagesC/ActivityH5', {
        webUrl: obj.popData.popConfig.btnStyle.jumpValue,
      })
      break
  }
}

/** 待删除
 * 自定义百度通用弹窗广告点击延时执行
 * @param {Object} obj 弹窗数据
 * @param {Object} pageDetail 页面信息数据
 * @param {Object} appObj app.ux数据
 * @param {Boolean} isReportOverTime 是否上报广告跳转超时事件
 */
function baiduPopAdClickdCallBack(
  obj,
  pageDetail,
  appObj,
  isReportOverTime = false
) {
  LOG('baiduPopAdClickdCallBack===================>', pageDetail)
  if (isReportOverTime) {
    try {
      COMMON_REPORT_UTILS.ad_overtime_report(obj.popData.advConfig.scenario)
    } catch (error) {
      LOG(error)
    }
  }
  // btn_jump_key  跳转新页面1 按策略路由返回2 退出应用3 关闭弹窗4'
  let btnJumpKey = Number(obj.popData.popConfig.btnStyle.jumpKey)
  switch (btnJumpKey) {
    case 1:
      let pageCode = obj.popData.popConfig.btnStyle.jumpValue
      $utils.routetheUrl(
        routerPath[pageCode].path,
        { ...routerPath[pageCode].param, pathUrl: pageDetail.pageName },
        false
      )
      break
    case 2:
      //按策略路由返回
      getPageBackRoute(pageDetail.pageCode, appObj)
      break
    case 3:
      try {
        //退出应用
        currentView.$app.exit()
      } catch (error) { }
      break
    case 4:
      // 关闭弹窗
      commonFunc2PatchPopShow(
        pageDetail,
        'POPUP_CLOSE',
        obj.popData.popConfig.code,
        pageDetail.pageRoute,
        appObj
      )
      break
  }
}
/**
 * 修改点击间隔标识
 */
function setIntervalAttr() {
  clickIntervalTime = Date.now()
  LOG(' mxt 设置点击间隔', clickIntervalTime)
}

/**
 * 弹窗触发行为code转换为行为名称
 * @param {String} actionCode 行为code
 */
function action2Name(actionCode) {
  LOG('CUSTOM', 'actionCode==>', actionCode)
  let actionName = ''
  let actionConfig = require('../json/actionConfig.json')
  actionName =
    actionCode &&
      actionConfig[`${actionCode}`] &&
      actionConfig[`${actionCode}`]['name']
      ? actionConfig[`${actionCode}`]['name']
      : '未知'
  return actionName + reportActionPopType()
}

export default {
  changeCurrentView,
  commonFunc2PatchPopShow,
  getPageBackRoute,
  commonPopControllerEventDispatch,
  noAd4UseEventHandler,
  bqtVideoAdEventDispatch,
  baiduPopAdClickdCallBack,
  reportActionPopType,
  resetActionPopType,
  readFunctionPopAdClick,
  setIntervalAttr,
  action2Name,
}
